const { db } = require('../schema/config')
const articleSchema = require('../schema/article')
const commetSchema = require('../schema/comment')
// 创建一个控制article表的模型对象
const Article = db.model("articles", articleSchema)
// 创建一个控制comment表的模型对象
const Comment = db.model("comments", commetSchema)


// 文章发表页
exports.addPage = async (ctx) => {
  await ctx.render("add-article", {
    title: "文章发表页",
    session: ctx.session
  })
}

// 将发表的文章存入数据库
exports.addToDB = async (ctx) => {
  // 判断用户是否登录
  if (ctx.session.isNew) {
    // 没登录
    return ctx.body = {
      status: false,
      msg: "用户未登录"
    }
  } else {
    // 已登录
    const data = ctx.request.body // 拿到文章的信息，包括了(tips, title, content)
    // 将author添加入data中
    data.author = ctx.session.uid
    data.commentNum = 0 // 文章发表时将评论置0
    // 将data存入数据库
    await new Promise((resolve, reject) => {
      new Article(data).save((err, data) => {
        if (err) {
          return reject(err)
        } else {
          return resolve(data)
        }
      })
    })
    .then(data => {
      ctx.body = {
        status: true,
        msg: "发布成功"
      }
    })
    .catch(err => {
      ctx.body = {
        status: false,
        msg: "系统错误"
      }
    })
  }
}

// 获取文章列表
exports.getList = async (ctx) => {

  let page = ctx.params.id || 1
  page--  // 跳过不需要查询的页数，page=5则跳过4页，4跳过3页，3跳过2页...

  // 查询数据库
  const data = await Article
  .find()
  .sort("-created")
  .skip(5 * page)
  .limit(5) // 在剩余的数据中只查询前5条数据
  .populate({ // 相当于sql中的多表查询功能，即关联查询users表
    path: "author",
    select: "username avatar"
  })
  .then(data => data)
  .catch(err => console.log(err))

  // 查询数据库中最大文档数量
  const maxNum = await Article
  .estimatedDocumentCount()
  .then(num => num)
  .catch(err => console.log(err))

  await ctx.render("index", {
    // 向pug内传递的参数对象
    title: "YchIzzz的博客",
    session: ctx.session,
    artList: data,
    maxNum
  })
}

// 文章详情页面
exports.getDetails = async (ctx) => {

  // 获取文章id
  const articleId = ctx.params.id

  // 通过id在数据库中查询对应文章
  const article = await Article
  .findById(articleId)
  .populate({
    path: "author",
    select: "username"
  })
  .then(data => data)
  .catch(err => console.log(err))

  // 获取文章对应的评论
  const comment = await Comment
  .find({article: articleId})
  .sort("-created")
  .populate({
    path: "from",
    select: "username avatar" 
  })
  .then(data => data)
  .catch(err => console.log(err))

  await ctx.render("article", {
    title: article.title,
    session: ctx.session,
    article,
    comment
  })

  
}